﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Librerias;

//Autor: Arturo Serna

namespace eCampus
{
    /// <summary>
    /// Formulario para crear y modificar Evento
    /// </summary>
    public partial class FormEventoCrearModificar : Form
    {
        string usuario;
        string asignatura;
        System.Windows.Forms.ErrorProvider errorPro = new ErrorProvider();
        bool esModificar;
        ENEventoAsignatura datos= null;

        /// <summary>
        /// Constructor para Crear un evento
        /// </summary>
        /// <param name="usu">Correo del profesorCorreo</param>
        /// <param name="asig">Código de la asignatura</param>
        public FormEventoCrearModificar(string usu, string asig)
        {
            esModificar = false;
            usuario = usu;
            asignatura = asig;
            InitializeComponent();
        }

        /// <summary>
        /// Constructor para modificar un evento
        /// </summary>
        /// <param name="data"></param>
        public FormEventoCrearModificar(ENEventoAsignatura data)
        {
            datos = data;
            esModificar = true;

            InitializeComponent();
        }

        /// <summary>
        /// Si el formulario modifica rellena los objetos del formulario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="entidadUsuario"></param>
        private void FormEventoCrearModificar_Load(object sender, EventArgs e)
        {
            if (esModificar)
            {
                tbAsunto.Text = datos.Asunto;
                tbMensaje.Text = datos.Texto;
                datFIni.Value = datos.FechaInicio;
                datFFin.Value = datos.FechaFin;
                btAceptar.Text = "Actualizar";

                cbHoraIni.Text = Date2String(datos.FechaInicio);
                cbHoraFin.Text = Date2String(datos.FechaFin);
            }
        }

        /// <summary>
        /// Convierte la hora de un DateTime en formato HH:MM
        /// </summary>
        /// <param name="date"></param>
        /// <returns>Hora en formato HH:MM</returns>
        string Date2String(DateTime date)
        {
            string res = "";

            if (date.Hour < 10)
            {
                res += "0" + date.Hour.ToString() + ":";
            }
            else
            {
                res += date.Hour.ToString() + ":";
            }

            if (date.Minute < 10)
            {
                res += "0" + date.Minute.ToString();
            }
            else
            {
                res += date.Minute.ToString();
            }
            
            return res;
        }

        /// <summary>
        /// A partir de un combo box, comprueba su hora y si es correcta la añade a horaAModificar
        /// </summary>
        /// <param name="combo">ComboBox del que se va a capturar la hora</param>
        /// <param name="horaAModificar">DateTime donde se va a introducir la hora capturada del ComboBox. No modificia día, mes ni año.</param>
        /// <param name="queEs">Puede ser "inicial" o "final". Se usa en: "Error, el formato de la hora "+queEs+" no es válido"</param>
        /// <returns></returns>
        private bool ExtraeHoras(ComboBox combo, ref DateTime horaAModificar, string queEs)
        {
            int i, horas, minutos;
            string aux;
            
            //Coge la cadena con formato "HH:MM"
            string cadenaEntrada = combo.Text.Trim();

            //Compreba que tiene el separador
            if (cadenaEntrada.Contains(":"))
            {
                //Extrae las horas
                aux = "";
                for (i = 0; i < cadenaEntrada.Length && cadenaEntrada[i] != ':'; i++)
                {
                    aux += cadenaEntrada[i];
                }
                i++;
                try
                {
                    horas = int.Parse(aux);
                }
                catch (Exception)
                {
                    errorPro.SetError(combo, "Formato incorrecto");
                    MessageBox.Show("Error, el formato de la hora " + queEs + " no es válido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }

                //Comprueba rango
                if (horas < 0 || horas > 23)
                {
                    errorPro.SetError(combo, "Las horas se salen de rango");
                    MessageBox.Show("Error, las horas no están dentro del rango", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }


                //Extrae minutos
                aux = "";
                for (; i < cadenaEntrada.Length && cadenaEntrada[i] != ':'; i++)
                {
                    aux += cadenaEntrada[i];
                }
                
                try
                {
                    minutos = int.Parse(aux);
                }
                catch (Exception)
                {
                    errorPro.SetError(combo, "Formato incorrecto");
                    MessageBox.Show("Error, el formato de la hora " + queEs + " no es válido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }

                //Compruebo rango
                if (minutos < 0 || minutos > 60)
                {
                    errorPro.SetError(combo, "Los minutos se salen de rango");
                    MessageBox.Show("Error, los minutos no están dentro del rango", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return false;
                }


                horaAModificar = new DateTime(horaAModificar.Year, horaAModificar.Month, horaAModificar.Day, horas, minutos, 0);

            }
            else
            {
                errorPro.SetError(combo, "Formato erróneo");
                MessageBox.Show("Error, el formato de la hora "+queEs+" no es válido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }

            return true;
        }


        /// <summary>
        /// A partir de los combobox, introduce en los TimePiker la hora, comprobando los rangos y formatos.
        /// </summary>
        /// <returns>true si todo va bien</returns>
        private bool AdaptaHora()
        {
            //Captura el valor del TimePicker de fecha inicial en "fecha"
            DateTime fecha = datFIni.Value;

            //Si la fecha es válida se guarde en "fecha"
            if (ExtraeHoras(cbHoraIni,ref fecha, "inicial"))
            {
                //La introducimos de nuevo en el TimePicker
                datFIni.Value = fecha;

                //Ahora lo mismo con fecha final.
                DateTime fecha2 = datFFin.Value;
                if (ExtraeHoras(cbHoraFin, ref fecha2, "final"))
                {
                    datFFin.Value = fecha2;


                    //Comprueba que la fecha final sea mayor que la inicial
                    if (fecha2 >= fecha) return true;
                    else
                    {
                        errorPro.SetError(cbHoraIni, "La fecha final es anterior a la inicial.");
                        errorPro.SetError(cbHoraFin, "La fecha final es anterior a la inicial.");

                        MessageBox.Show("Las horas introducidas no son correctas.\r\nLa fecha final es anterior a la inicial.", "Error en las fechas", MessageBoxButtons.OK , MessageBoxIcon.Exclamation);
                    }
                }
            }

            return false;
        }

        /// <summary>
        /// Si esModificar==false inserta una nueva fila.
        /// Si esModicicar==true actualiza la fila. 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="entidadUsuario"></param>
        private void btAceptar_Click(object sender, EventArgs e)
        {

            //AdaptaHora comprueba los rangos de las horas de los ComboBox
            //Si son correctos, los añade al TimePicker.
            if (AdaptaHora())
            {
                //Crear
                if (!esModificar)
                {
                    try
                    {
                        (new ENEventoAsignatura(usuario, asignatura, tbAsunto.Text, tbMensaje.Text, datFIni.Value, datFFin.Value)).Alta();
                    }
                    catch (Excepcion_Conexion ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }

                    Close();
                }
                //Modificar
                else
                {
                    try
                    {
                        datos.FechaInicio = datFIni.Value;
                        datos.FechaFin = datFFin.Value;
                        datos.Asunto = tbAsunto.Text;
                        datos.Texto = tbMensaje.Text;
                        datos.Modificacion();
                    }
                    catch (Excepcion_Conexion ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }

                    Close();
                }
            }
        }

        /// <summary>
        /// Limpia los posibles Error Providers cuando se accede a un TimePicker o ComboBox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="entidadUsuario"></param>
        private void LimpiaErrorProvider(object sender, EventArgs e)
        {
            errorPro.Clear();
        }

    }
}
